package com.adisi.bd;

import com.adisi.objetos.Alerta;
import com.adisi.objetos.Auto;
import com.adisi.objetos.Dueno;
import com.adisi.objetos.DuenoManager;
import com.adisi.objetos.EstadoAlerta;
import com.adisi.objetos.EstadoAuto;
import com.adisi.objetos.TipoCombustible;

import java.math.BigDecimal;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

public class AutoDatos {
	
	/**
	 * Obtiene una lista de todas las personas que son Usuarios del sistema
	 * @param disponibles 
	 * 
	 * @return List<Auto>
	 */
	public List<Auto> conseguirTodosLosAutos(boolean disponibles) {
		List<Auto> listado = new ArrayList<Auto>();
		
		Connection con = null;
		Coneccion coneccion = new Coneccion();
		ResultSet rs = null;
		
		CallableStatement sp = null;
		
		try {
			
			DuenoDatos dd = new DuenoDatos();
			AlertaDatos ad = new AlertaDatos();
			
			con = coneccion.conectar();
			
			if(disponibles)
				sp = con.prepareCall("{call sp_Auto_Select_All_2}");
			else
				sp = con.prepareCall("{call sp_Auto_Select_All}");
			
			sp.execute();
			
			rs = sp.getResultSet();
			/*
			 * int idAuto, 
			 * char[] dominioAuto, 
			 * String marcaAuto,
			 * String modeloAuto, 
			 * int anoModeloAuto, 
			 * String colorAuto,
			 * boolean fumigadoAuto, Date fechaFumigacionAuto,
			boolean habilitadoAuto, Date fechaHabilitacionAuto,
			Dueno duenoAuto, TipoCombustible tipoCombustibleAuto,
			EstadoAuto estadoAuto
			 * */
			while (rs.next()) {
				
				Auto auto = new Auto(
						rs.getInt("id_auto"),
						rs.getString("dominio").trim(),
						rs.getString("marca"),
						rs.getString("modelo"),
						rs.getInt("fecha_fabricacion"),
						rs.getString("color"),
						(rs.getInt("fumigado")>0),
						rs.getDate("fecha_fumigacion"),
						(rs.getInt("habilitado")>0),
						rs.getDate("fecha_habilitacion"),
						dd.conseguirUnDueno(rs.getInt("id_dueno")),
						TipoCombustible.valueOf(rs.getString("tipo_combustible").toUpperCase()),
						EstadoAuto.valueOf(rs.getString("estado").toUpperCase()),
						rs.getBigDecimal("kms")
				);
				
				ArrayList<Alerta> alertas = ad.conseguirTodasLasAlertas("Auto", rs.getInt("id_auto"), null, EstadoAlerta.ACTIVA);
				
				auto.setAlertas(alertas);
				
				listado.add(auto);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				rs.close();
				sp.close();
				con.close();
			} catch (SQLException e) {
				System.out.println("problema al cerrar");
			}
		}
		return listado;
	}
	
	/**
	 * Obtiene una lista de todas las personas que son Usuarios del sistema con un determinado perfil
	 * 
	 * @param Perfil
	 * 
	 * @return List<Auto>
	 */
	public List<Auto> conseguirTodosLosAutos(Dueno dueno) {
		List<Auto> listado = new ArrayList<Auto>();
		
		Connection con = null;
		Coneccion coneccion = new Coneccion();
		ResultSet rs = null;
		
		CallableStatement sp = null;
		
		AlertaDatos ad = new AlertaDatos();
		
		try {
		
			con = coneccion.conectar();
			
			sp = con.prepareCall("{call sp_Auto_Select_x_DuenoId(?)}");
			sp.setInt("dueno_id", dueno.getIdDueno());
			
			sp.execute();
			
			rs = sp.getResultSet();
			
			while (rs.next()) {
				Auto auto = new Auto(
						rs.getInt("id_auto"),
						rs.getString("dominio"),
						rs.getString("marca"),
						rs.getString("modelo"),
						rs.getInt("fecha_fabricacion"),
						rs.getString("color"),
						(rs.getInt("fumigado")>0),
						rs.getDate("fecha_fumigacion"),
						(rs.getInt("habilitado")>0),
						rs.getDate("fecha_habilitacion"),
						DuenoManager.conseguirUnDueno(rs.getInt("dueno_id")),
						TipoCombustible.valueOf(rs.getString("tipo_combustible")),
						EstadoAuto.valueOf(rs.getString("estado")),
						rs.getBigDecimal("kms")
						);
				
				ArrayList<Alerta> alertas = ad.conseguirTodasLasAlertas("Auto", rs.getInt("id_auto"), null, EstadoAlerta.ACTIVA);
				
				auto.setAlertas(alertas);
				
				listado.add(auto);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				rs.close();
				sp.close();
				con.close();
			} catch (SQLException e) {
				System.out.println("problema al cerrar");
			}
		}
		return listado;
	}	
	
	
	
	/**
	 * Obtiene los datos de 1 Auto del sistema buscando por Id
	 * 
	 * @param Id
	 * 
	 * @return Auto
	 */
	public Auto conseguirUnAuto(int idAuto) {
		
		Auto auto = null;
		Connection con = null;
		Coneccion coneccion = new Coneccion();
		ResultSet rs = null;
		
		CallableStatement sp = null;
		
		try {
			DuenoDatos dd = new DuenoDatos();
			AlertaDatos ad = new AlertaDatos();
			con = coneccion.conectar();
			
			sp = con.prepareCall("{call sp_Auto_Select_x_Id(?)}");
			sp.setInt(1, idAuto);
			sp.execute();
			
			rs = sp.getResultSet();
			while (rs.next()) {
				
				auto = new Auto(
						rs.getInt("id_auto"),
						rs.getString("dominio"),
						rs.getString("marca"),
						rs.getString("modelo"),
						rs.getInt("fecha_fabricacion"),
						rs.getString("color"),
						(rs.getInt("fumigado")>0),
						rs.getDate("fecha_fumigacion"),
						(rs.getInt("habilitado")>0),
						rs.getDate("fecha_habilitacion"),
						dd.conseguirUnDueno(rs.getInt("id_dueno")),
						TipoCombustible.valueOf(rs.getString("tipo_combustible").toUpperCase()),
						EstadoAuto.valueOf(rs.getString("estado").toUpperCase()),
						rs.getBigDecimal("kms")
						);
				
				ArrayList<Alerta> alertas = ad.conseguirTodasLasAlertas("Auto", rs.getInt("id_auto"), null, EstadoAlerta.ACTIVA);
				
				auto.setAlertas(alertas);
								

			}
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				rs.close();
				sp.close();
				con.close();
			} catch (SQLException e) {
				System.out.println("problema al cerrar");
			}
		}
		return auto;
	}

	/**
	 * Obtiene los datos de 1 Auto del sistema buscando por Nombre de Auto
	 * 
	 * @param Id
	 * @param boolean
	 * 
	 * @return Auto
	 */
	public Auto conseguirUnAuto(String dominio) {
		
		Auto auto = null;
		
		Connection con = null;
		
		Coneccion coneccion = new Coneccion();
		
		CallableStatement sp = null;
		ResultSet rs = null;
		
		try {
			DuenoDatos dd = new DuenoDatos();
			AlertaDatos ad = new AlertaDatos();
			
			con = coneccion.conectar();
			
			sp = con.prepareCall("{call sp_Auto_Select_x_Dominio(?)}");
			sp.setString(1, dominio);
			
			sp.execute();
			rs=sp.getResultSet();
			
			while (rs.next()) {
				
				Calendar fechaFabricacion = Calendar.getInstance() ;
				fechaFabricacion.setTime(rs.getDate("fecha_fabricacion"));
				
				auto = new Auto(
						rs.getInt("id_auto"),
						dominio,
						rs.getString("marca"),
						rs.getString("modelo"),
						rs.getInt("fecha_fabricacion"),
						rs.getString("color"),
						(rs.getInt("fumigado")>0),
						rs.getDate("fecha_fumigacion"),
						(rs.getInt("habilitado")>0),
						rs.getDate("fecha_habilitacion"),
						dd.conseguirUnDueno(rs.getInt("dueno_id")),
						TipoCombustible.valueOf(rs.getString("tipo_combustible")),
						EstadoAuto.valueOf(rs.getString("estado")),
						rs.getBigDecimal("kms")
						);
				
				ArrayList<Alerta> alertas = ad.conseguirTodasLasAlertas("Auto", rs.getInt("id_auto"), null, EstadoAlerta.ACTIVA);
				
				auto.setAlertas(alertas);
				
				
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				rs.close();
				sp.close();
				con.close();
			} catch (SQLException e) {
				System.out.println("problema al cerrar");
			}
		}
		return auto;
	}

	
	

	/**
	 * Borra los datos de 1 Auto 
	 * 
	 * @param idUsuario
	 * 
	 * @return boolean
	 */
	public boolean borrarUnAuto(int idAuto) {
		
		Connection con = null;
		
		Coneccion coneccion = new Coneccion();
		
		CallableStatement sp = null;
		
		boolean ok = true;

		/*
		 	@id_auto as int,
		 */
		
		
		try {
			con = coneccion.conectar();
			sp = con.prepareCall("{call sp_Auto_Delete(?)}");
			
			sp.setInt("id_auto", idAuto);
			
			sp.execute();  
			
			
		} catch (SQLException e) {
			ok = false;
			//e.printStackTrace();
			
		} finally {
			
			try {
				sp.close();
				con.close();
			} catch (SQLException e) {
				System.out.println("problema al cerrar");
			}
		}
		return ok;
	}
	
	
	/**
	 * Graba un auto en la base de datos.
	 * 
	 * Devuelve el Id del auto grabado, o cero si fallo la grabacion
	 * 
	 * @param auto
	 * @return
	 */
	public int grabarUnAuto(Auto auto) {
		
		Connection con = null;
		
		Coneccion coneccion = new Coneccion();
		
		CallableStatement sp = null;
		
		int ok = 0;
		
		try {
			con = coneccion.conectar();
			
			if(auto.getIdAuto()!=0) {
			
				sp = con.prepareCall("{call sp_Auto_Update(?,?,?,?,?,?,?,?,?,?)}");
				
				sp.setInt("id_auto", auto.getIdAuto());
				
				String dominio = auto.getDominioAuto();
				sp.setString("dominio", dominio);
				
				sp.setString("marca", auto.getMarcaAuto());
				sp.setString("modelo", auto.getModeloAuto());
				sp.setString("color", auto.getColorAuto());
				/*
				sp.setInt("fecha_fabricacion", auto.getAnoModeloAuto());
				sp.setInt("fumigado", auto.isFumigadoAuto()?1:0);
				sp.setDate("fecha_fumigacion", (java.sql.Date) auto.getFechaFumigacionAuto());
				sp.setInt("habilitado", auto.isHabilitadoAuto()?1:0);
*/
				sp.setInt("fecha_fabricacion", auto.getAnoModeloAuto());
				sp.setInt("dueno_id", auto.getDuenoAuto().getIdDueno());
				sp.setString("tipo_combustible", auto.getTipoCombustibleAuto().toString());
				sp.setString("estado", auto.getEstadoAuto().toString().toUpperCase());
				sp.setBigDecimal("kms", auto.getKms());
				
				sp.execute();
				
				ok = auto.getIdAuto();
				
			} else {
				
				sp = con.prepareCall("{? = call sp_Auto_Insert(?,?,?,?,?,?,?,?,?)}");
				
				sp.registerOutParameter(1, java.sql.Types.INTEGER);
				
				String dominio = auto.getDominioAuto().toString();
				
				sp.setString("dominio", dominio);
				sp.setString("marca", auto.getMarcaAuto());
				sp.setString("modelo", auto.getModeloAuto());
				sp.setString("color", auto.getColorAuto());
				/*
				sp.setInt("fecha_fabricacion", auto.getAnoModeloAuto());
				sp.setInt("fumigado", auto.isFumigadoAuto()?1:0);
				sp.setDate("fecha_fumigacion", (java.sql.Date) auto.getFechaFumigacionAuto());
				sp.setInt("habilitado", auto.isHabilitadoAuto()?1:0);
*/				
				sp.setInt("fecha_fabricacion", auto.getAnoModeloAuto());
				sp.setInt("dueno_id", auto.getDuenoAuto().getIdDueno());
				sp.setString("tipo_combustible", auto.getTipoCombustibleAuto().toString());
				sp.setString("estado", auto.getEstadoAuto().toString().toUpperCase());	
				sp.setBigDecimal("kms", auto.getKms());
				
				sp.execute();
				
				auto.setIdAuto(sp.getInt(1));
				
				ok = auto.getIdAuto();
			}
			
			  
			
			
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			try {
				sp.close();
				con.close();
			} catch (SQLException e) {
				System.out.println("problema al cerrar");
			}
		}
		
		return ok;
	}	
	
	/**
	 * Graba un auto en la base de datos.
	 * 
	 * Devuelve el Id del auto grabado, o cero si fallo la grabacion
	 * 
	 * @param auto
	 * @return
	 */
	public boolean grabarUnAuto(int idAuto, BigDecimal kms) {
		
		Connection con = null;
		
		Coneccion coneccion = new Coneccion();
		
		CallableStatement sp = null;
		
		boolean ok = false;
		
		try {
			con = coneccion.conectar();
			
			sp = con.prepareCall("{call sp_Auto_Update(?,?,?,?,?,?,?,?,?,?)}");
			
			sp.setInt("id_auto", idAuto);
			sp.setBigDecimal("kms", kms);
			
			sp.setNull("dominio", java.sql.Types.VARCHAR);
			sp.setNull("marca", java.sql.Types.VARCHAR);
			sp.setNull("modelo", java.sql.Types.VARCHAR);
			sp.setNull("color", java.sql.Types.VARCHAR);
			sp.setNull("fecha_fabricacion", java.sql.Types.INTEGER );
			sp.setNull("dueno_id", java.sql.Types.INTEGER );
			sp.setNull("tipo_combustible", java.sql.Types.VARCHAR);
			sp.setNull("estado", java.sql.Types.VARCHAR);
				
			sp.execute();
			
			ok = true;
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				sp.close();
				con.close();
			} catch (SQLException e) {
				System.out.println("problema al cerrar");
			}
		}
		
		return ok;
	}	
	
	
	
}
